iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0
Kubernetes

Think Again Kubernetes系列 第 11

Admission Controller

  • 分享至 

  • xImage
  •  

你有沒有想過,當你設定 PVC 時,他們是怎麼選擇預設的 StorageClass? 這些都是由 Admission Controller 注入的,在本文章,我們會介紹一些 Admission Controller,並討論一些實務上可能用到的 Admission Controller。

Kubernetes 文件對於 Admission Controller 的解釋恰到好處

An admission controller is a piece of code that intercepts requests to the Kubernetes API server prior to persistence of the object, but after the request is authenticated and authorized.

Admission Controler 對截取對 API Server 的請求,當然這個請求是必須通過驗證與授權。

Admission Controller 分兩種,一種是 mutate,另一種是 validate,mutate 會修改資源屬性,實務上最常用注入 sidecar 容器,validate 會驗證請求,如果請求不合格就會拒絕。

以下是一個 API request 從 API server 進到 etcd 的過程

https://ithelp.ithome.com.tw/upload/images/20240920/20169135QALmEpZCZB.png

Admission Controller 主要用於三個情境

  1. Policy and Governance

  2. Security

  3. Resource Management

這邊介紹一些平時會用到,但是你可能沒注意到是 Admission Controller 的功能

Service Accounts

  1. 如果你的 pod.spec 沒有 Service Account,Service account admission controller 會幫你注入一個 default service account,這就是為什麼我們 deployment 就算沒有 service account,終端的 pod 也會出現

  2. 如果你的 pod.spec 有設定 service account,Service account admission controller 會去檢查這個 Service account 存在與否,如果不存在,將會拒絕這個請求。

  3. 如果你的 pod.spec 沒有設定 imagePullSecrets,Service account admission controller 會幫你注入 imagePullSecrets,imagePullSecrets 將從 service account 的設定取得。

built-in 的 admission controller 經常用於檢查 pod.spec 中的資源存在與否,除了 Service accounts 的例子,namespace 也許有相關的 admission controller

NamespaceExists: 如果你的 metadata.namespace 不存在,拒絕這個請求。

NamespaceLifecycle: 如果你請求的 metadata.namespace 正在銷毀,拒絕這個請求。

TaintNodesByCondition

新加入的 Node 需要驗證狀態,為了不讓 Pod 被排程正在驗證狀態的 Node,所有新加入的 node 都會被 TaintNodesByCondition 打上 Taint,直到狀態恢復正常。

DefaultTolerationSeconds

API server 有兩個參數 default-not-ready-toleration-seconds, default-unreachable-toleration-seconds,這兩個參數預設是五分鐘,會決定 Node 不穩定時,pod failover 的時間。這兩個參數是也是 pod.spec 沒有設定時,會由 admission controller 設定。

Security

PodSecurity

PodSecurity 可以控制基於 namespace 的 Pod 的隔離等級,比如說,可不可以用 root user 運行、可不可以分享 host namespace 之類的,這些都是 PodSecurity Admission Controller 藉由驗證 pod.spec 相關欄位來做控制。

Resource Management

除了演證欄位,admission controller 也會用於資源控管,以下列出常見的

ResourceQuota:

在多租戶的情況下,我們會用 ResourceQuota 限制 namespace 的資源使用,這個就是一種 admission controller 實作的功能

LimitRanger:

設定 pod.spec 的 best practice 是每一個都要設定 resource,不過多租戶的情況下,有些應用情境會偏好在某個 namespace 下面預設所有 pod 的資源,這時候可以用 LimitRange,LimitRange 會利用 LimitRanger admission controller 注入資源的相關設定


上一篇
Kubernetes: Cloud OS
下一篇
Dynamic Admission Controller
系列文
Think Again Kubernetes31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言